22d327cfbe4a3114ece4b4e2374de243a8d70730,src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java,StaticTypeCheckingVisitor,getResultType,#ClassNode#number#ClassNode#BinaryExpression#,776

Before Change


        } else if (isBoolIntrinsicOp(op)) {
            return boolean_TYPE;
        } else if (isArrayOp(op)) {
            ClassNode arrayType = getType(expr.getLeftExpression());
            if (ClassHelper.STRING_TYPE.equals(arrayType)) {
                // special case here
                return ClassHelper.STRING_TYPE;

After Change


        ClassNode leftRedirect = left.redirect();
        ClassNode rightRedirect = right.redirect();

        Expression leftExpression = expr.getLeftExpression();
        if (op == ASSIGN) {
            if (leftRedirect.isArray() && !rightRedirect.isArray()) return leftRedirect;
            if (leftRedirect.implementsInterface(Collection_TYPE) && rightRedirect.implementsInterface(Collection_TYPE)) {
                return right;
            }
            if (rightRedirect.implementsInterface(Collection_TYPE) && rightRedirect.isDerivedFrom(leftRedirect)) {
                // ex : def foos = ['a','b','c']
                return right;
            }
            if (leftExpression instanceof VariableExpression) {
                VariableExpression target = (VariableExpression) leftExpression;
                if (target.getAccessedVariable() instanceof VariableExpression && target.getAccessedVariable()!=leftExpression) {
                    target = (VariableExpression) target.getAccessedVariable();
                }
                ClassNode initialType = target.getType().redirect();
                // as anything can be assigned to a String, Class or boolean, return the left type instead
                if (STRING_TYPE.equals(initialType)
                        || CLASS_Type.equals(initialType)
                        || Boolean_TYPE.equals(initialType)
                        || isPrimitiveType(initialType)) {
                    return initialType;
                }
            }
            return rightRedirect;
        } else if (isBoolIntrinsicOp(op)) {
            return boolean_TYPE;
        } else if (isArrayOp(op)) {
            ClassNode arrayType = getType(leftExpression);
            if (ClassHelper.STRING_TYPE.equals(arrayType)) {
                // special case here
                return ClassHelper.STRING_TYPE;